<!-- 
    浅拷贝：浅拷贝指的是将一个对象的属性值复制到另一个对象，如果有的属性的值为引用类型的话，那么会将这个引用的地址复制给对象，
           因此两个对象会有同一个引用类型的引用。浅拷贝可以使用  Object.assign 和展开运算符来实现。
    深拷贝：深拷贝相对浅拷贝而言，如果遇到属性值为引用类型的时候，它新建一个引用类型并将对应的值复制给它，
          因此对象获得的一个新的引用类型而不是一个原有类型的引用。深拷贝对于一些对象可以使用 JSON 的两个函数来实现，
          但是由于 JSON 的对象格式比 js 的对象格式更加严格，所以如果属性值里边出现函数或者 Symbol 类型的值时，会转换失败 
-->
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
</head>
<body>
    <div>05-浅拷贝</div>
    <script>
        // JSON.parse(JSON.stringify(obj))是目前比较常用的深拷贝方法之一
        // let obj1 ={a:0,
        // b:{c:0}}
        // let obj2 = JSON.parse(JSON.stringify(obj1))
        // obj1.a=1
        // obj1.b.c=1
        // console.log(obj1)
        // console.log(obj2)
        
        //函数库lodash的_.cloneDeep方法
        // var _ =require('lodash')
        // var obj1 = {
        //     a:1,
        //     b:{f:{g:1}},
        //     c:[1,2,3]
        // } 
        // var obj2 = _.cloneDeep(obj1)
        // console.log(obj1.b.f === obj2.b.f)

        // 手写实现深拷贝函数
        function deepCopy(object){
            if(!object ||typeof object !=='object') return ;

            let newObject = Array.isArray(object)?[]:{}

            for(let key in object){
                if(Object.hasOwnPropertry(key)){
                    newObject[key] = 
                    typeof object[key] === 'object'?deepCopy(object[key]):object[key];
                }
            }

            return newObject
        }


</script>
</body>
</html>
